package com.gjt.clientSocket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import java.net.SocketAddress;

/**
 * Created with Intel IDEA.
 *
 *   Socket 信息
 *    1：socket地址（SocketAddress）空的抽象类，只有一个默认的构造函数没有其他方法
 *      实例方法（如果没有连接则会null）
 *      public SocketAddress getRemoteSocketAddress();返回连接系统的地址
 *      public SocketAddress getLocalSocketAddress();返回发起连接的地址
 *    2: InetSocketAddress 是SocketAddress 唯一子类
 *          public InetSocketAddress(InetAddress address, int port)
 *          public InetSocketAddress(String host, int port)
 *          public InetSocketAddress(int port)
 *       还可以使用静态工厂方法
 *          public static InetSocketAddress createUnresolved(String host,int port)
 *     3:InetSocketAddress 实例方法
 *          public final InetAddress getAddress();
 *          public final int getPort();
 *          public final String getHostName();
 *     4:Socket属性
 *          public InetAddress getInetAddress();
 *          public int getPort();
 *          public InetAddress getLocalAddress()
 *          public int getLocalPort()
 *          isClosed(): 如果socket关闭返回false,如果socket从来没有打开过那也是false
 *          isConnected(): 他表示socket 是否从未练过主机
 *          isBound(): 告诉你是否成功绑定到本地系统上的站端口
 *        notes: 要检查Socket 是否打开 ，isConnected 返回true,isClosed() 返回false
 *
 *     5:设置Socket 选项
 *          （1）TCP_NODELAY:尽可能快的发送，无论包的大小
 *              public void setTcpNoDelay(boolean on)：true 关闭了Socket 缓冲
 *              public boolean getTcpNoDelay()
 *           (2)SO_LINGER:指定了Socket关闭时如何处理尚未发送的数据报
 *              public void setSoLinger(boolean on, int second)
 *              public int getSoLinger():返回-1 相当于禁用延迟
 *              在默认情况下close() 方法立即返回，但系统会尝试发送剩余的数据，如果将延迟设置为0，Socket 关闭时，所有未发送的数据丢弃
 *           （3）SO_TIMEOUT:正常时候，Socket读取数据时，read调用会阻塞尽可能长时间得到足够的字节，可以设置等待时间，即使超时后Socket 仍然时连接的，
 *                      可以再次读取该socket
 *            (4)SO_RCVBUF/SO_SNDBUF:用于网络输入的建议接收缓冲区大小/发送缓冲区大小。但实际上缓冲区通常会设置未二者中的较小的
 *               public void setReceiveBufferSize(int size)
 *               public int getReceiveBufferSize()
 *               public void setSendBufferSize(int size)
 *               public int getSendBufferSize()
 *            (5)SO_KEEPLIVE:如果打开了，客户端偶尔会通过一个空闲连接发送一个数据包，确保服务器没有崩溃
 *               public void setKeepAlive(boolean on)
 *               public boolean getKeepAlive()
 *            (6)OOBINLINE:TCP包括一个可以发送单字节带外（Out Of Band）紧急数据的特性，数据会立即发送，接收方可以优先处理这个紧急数据
 *               public void sendUrgentData(int data):会立即发送参数值中的最低字节
 *               public void setOOBInLine(boolean on):true 希望接收正常数据中的紧急数据 默认时false
 *               public boolean getOOBInLine()
 *            (7)SSO_REUSEADDR:一个Socket关闭时，可能不会立即释放本地端口，确保传过来的延迟数据包不会传入绑定到同一端口的新进程
 *               public void setReuseAddress(boolean on)
 *               public boolean getReuseAddress()
 *               note: 意味着Socket 必须使用无参构造函数以非链接状态创建，使用connect 连接SOCKET
 *            (8)IP_TOS服务类型
 *
 * @Auther: gjt
 * @Date: 2024/4/10 0:08
 */
public class InformationSocket {


    /**
     *  使用 myProxy.example.com 的SOCKS代理服务器来连接主机login.ibiblio.org
     * @throws IOException
     */
    private static  void proxyCreateSocket() throws IOException {
        SocketAddress address = new InetSocketAddress("myProxy.example.com", 1080);
        Proxy proxy = new Proxy(Proxy.Type.SOCKS, address);
        Socket socket = new Socket(proxy);

        socket.setReceiveBufferSize(1024);
        SocketAddress s = new InetSocketAddress("login.ibiblio.org", 25);
        socket.connect(s);
    }

    public static void main(String[] args) {

    }
}
